// 1.题目描述
// 假设有一个很长的花坛，一部分地块种植了花，另一部分却没有。可是，花不能种植在相邻的地块上，它们会争夺水源，两者都会死去。

// 给你一个整数数组 flowerbed 表示花坛，由若干 0 和 1 组成，其中 0 表示没种植花，1 表示种植了花。另有一个数 n ，能否在不打破种植规则的情况下种入 n 朵花？能则返回 true ，不能则返回 false 。



// 示例 1：

// 输入：flowerbed = [1,0,0,0,1], n = 1
// 输出：true
// 示例 2：

// 输入：flowerbed = [1,0,0,0,1], n = 2
// 输出：false

// 自己的答案（错误：原因是一开始误以为题目给定的数组里的1的位置是不变的，其实题目给的数组里0和1都是可以自己组织的）：
/**
 * @param {number[]} flowerbed
 * @param {number} n
 * @return {boolean}
 */
var canPlaceFlowers = function (flowerbed, n) {
    let arr = new Array(flowerbed.length).fill(0) // 001 0001
    let count = 0
    flowerbed.forEach((e, i) => {
        if (arr[i] === 1) {
            count = i
        }
    })
    if (count % 2 > 0) { // 奇数为1
        arr = arr.map((e, i) => { // 偶数为1 010101
            if (i % 2 > 0) {
                e = 1
            }
            return e
        })
    } else {
        arr = arr.map((e, i) => { // 奇数为1 101010
            if (i % 2 === 0) {
                e = 1
            }
            return e
        })
    }

    console.log(arr, arr.filter(e => e === 1).length - flowerbed.filter(e => e === 1).length)
    return arr.filter(e => e === 1).length - flowerbed.filter(e => e === 1).length >= n
};

canPlaceFlowers([0, 0, 1, 0, 1], 2)

// Gpt答案：
/**
 * @param {number[]} flowerbed
 * @param {number} n
 * @return {boolean}
 */
var canPlaceFlowers = function (flowerbed, n) {
    let count = 0;
    let length = flowerbed.length;
    let i = 0;

    while (i < length) {
        if (flowerbed[i] === 0 &&
            (i === 0 || flowerbed[i - 1] === 0) &&
            (i === length - 1 || flowerbed[i + 1] === 0)) {
            flowerbed[i] = 1;
            count++;
        }
        i++;
    }

    return count >= n;
};
// 解释：
// 初始化：
// count 用于记录已经成功种植的花朵数量。
// length 用于获取花坛数组的长度。
// i 作为遍历数组的索引。

// 遍历花坛数组：
// 使用 while 循环遍历数组，每次检查当前位置 i 是否可以种植花。
// 当前位置 i 可以种植花的条件是：
// flowerbed[i] 为 0（当前位置为空）。
// i === 0 || flowerbed[i - 1] === 0（如果是第一个位置或者前一个位置为空）。
// i === length - 1 || flowerbed[i + 1] === 0（如果是最后一个位置或者后一个位置为空）。

// （用自己的话来理解就是：
// 1.当前元素为0且前后为0   flowerbed[i] === 0 && flowerbed[i - 1] === 0 && flowerbed[i+1] === 0
// 2.如果第一项为0，则    flowerbed[i] === 0 && i === 0 && flowerbed[i + 1] === 0
// 3.如果最后一项为0，则    flowerbed[i] === 0 && i === length - 1 && flowerbed[i - 1] === 0
// 整合起来就是上面的）

// 种植花朵：
// 如果当前位置满足种植条件，则将 flowerbed[i] 设置为 1，并增加 count。

// 返回结果：
// 最后判断 count 是否大于等于 n，如果是则返回 true，否则返回 false。

// 官方简单易懂题解
// 在 flowerbed 数组两端各增加一个 0， 这样处理的好处在于不用考虑边界条件，任意位置处只要连续出现三个 0 就可以栽上一棵花。
var canPlaceFlowers = function (flowerbed, n) {
    flowerbed.unshift(0)
    flowerbed.push(0)
    let count = 0;
    let len = flowerbed.length;
    for (let i = 0; i < len; i++) {
        if (flowerbed[i - 1] === 0 && flowerbed[i] === 0 && flowerbed[i + 1] === 0) {
            flowerbed[i] = 1;
            count++
        }
    }
    return count >= n;
};